#include <iostream>
#include <gmp.h>

using namespace std;


template <class T> void  generic_multiply(T & res, const T&, const T&){
	}

template <> void generic_multiply<int>(int& c,  const int& a, const int& b){
		 c=a*b;
}

template <> void generic_multiply<mpz_t>(mpz_t& c, const mpz_t& a, const mpz_t& b){
		mpz_mul(c,a,b);	
}

int main(){
	cout << "Testing int ..." << endl;
	int a=5, b=10,c;

	generic_multiply(c,a,b);
	cout << a<< "*" << b << "=" << c << endl;

	cout << "Testing mpz_t ..." << endl;

	mpz_t ma,mb, mc;
	mpz_init(ma);
	mpz_init(mb);
	mpz_init(mc);
	mpz_init_set_str(ma, "15", 0);
	mpz_init_set_str(mb, "25", 0);


	generic_multiply(mc,ma,mb);

	cout << mpz_get_si(ma) << "*" << mpz_get_si(mb) << "=" << mpz_get_si(mc) << endl;
	mpz_clear(ma);
	mpz_clear(mb);
	mpz_clear(mc);
	return 0;
}
